using System;
using System.Collections.Generic;
using System.Data;

using AplicacionTest.DataType;

namespace AplicacionTest.DataAccess
{
    public class ProyectoData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros;
        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public ProyectoData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }
        private DataUtil _consultaDataReader()
        {
            string sql = _select + _join + this.Where;

            DataUtil data = new DataUtil(TypeDataBase.Prueba, CommandType.Text,sql);

            data.AddParametersDictionary(this._parametrosConsulta);

            this._limpiarConsulta();

            return data;
        }

        private DataUtil _consultaPaginadaDataReader(int paginaActual, int cantidadMostrar, string orderBy)
        {
            DataUtil data = DataReader.ReturnPagingReader(_select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy,ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        PR.ID                                               AS ID
                        ,PR.NOMBRE                                          AS NOMBRE
                        ,PR.DESCRIPCION                                     AS DESCRIPCION
                        ,CONVERT(varchar(10),PR.FECHAREGISTRO,103)          AS FECHAREGISTRO
                        ,ISNULL(PR.PRIORIDAD,0)                             AS PRIORIDAD    
                        ,ISNULL(PR.SEVERIDAD,0)                             AS SEVERIDAD
                        ,ISNULL(PR.ACTIVO,0)                                AS ACTIVO
                        ,(CASE PR.ACTIVO WHEN 1 THEN 'SI' ELSE 'NO' END)    AS ACTIVODESCRIPCION
                        ";

            _join = @"FROM DBO.PROYECTO [PR]
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual,int cantidadMostrar,string orderBy)
        {
            _select = @"SELECT
                        PR.ID                                               AS ID
                        ,PR.NOMBRE                                          AS NOMBRE
                        ,PR.DESCRIPCION                                     AS DESCRIPCION
                        ,CONVERT(varchar(10),PR.FECHAREGISTRO,103)          AS FECHAREGISTRO
                        ,ISNULL(PR.PRIORIDAD,0)                             AS PRIORIDAD    
                        ,ISNULL(PR.SEVERIDAD,0)                             AS SEVERIDAD
                        ,ISNULL(PR.ACTIVO,0)                                AS ACTIVO
                        ,(CASE PR.ACTIVO WHEN 1 THEN 'SI' ELSE 'NO' END)    AS ACTIVODESCRIPCION
                        ";

            _join = @"FROM DBO.PROYECTO [PR]
                      ";

            if(paginaActual == 0) 
                return this._consultaDataReader();
            else
                return this._consultaPaginadaDataReader(paginaActual,cantidadMostrar,orderBy);
        }

        public void Grabar(ProyectoType proyecto)
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM PROYECTO WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO PROYECTO
                               (
                                   NOMBRE
                                  ,DESCRIPCION
                                  ,FECHAREGISTRO
                                  ,PRIORIDAD
                                  ,SEVERIDAD
                                  ,ACTIVO
                               )
                               VALUES
                               (
                                   @NOMBRE
                                  ,@DESCRIPCION
                                  ,CONVERT(DATE,@FECHAREGISTRO,103)
                                  ,@PRIORIDAD
                                  ,@SEVERIDAD
                                  ,@ACTIVO
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE PROYECTO SET
                               NOMBRE=@NOMBRE
                              ,DESCRIPCION=@DESCRIPCION
                              ,FECHAREGISTRO=CONVERT(DATE,@FECHAREGISTRO,103)
                              ,PRIORIDAD=@PRIORIDAD
                              ,SEVERIDAD=@SEVERIDAD
                              ,ACTIVO=@ACTIVO
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            using (DataUtil d = new DataUtil(TypeDataBase.Prueba, CommandType.Text))
            {
                d.Comando.CommandText = sql;

                d.AddParameter("@ID", (proyecto.Id == null ? "0" : proyecto.Id));
                d.AddParameter("@NOMBRE", proyecto.Nombre);
                d.AddParameter("@DESCRIPCION", proyecto.Descripcion);
                d.AddParameter("@FECHAREGISTRO", proyecto.FechaRegistro);
                d.AddParameter("@PRIORIDAD", proyecto.Prioridad);
                d.AddParameter("@SEVERIDAD", proyecto.Severidad);
                d.AddParameter("@ACTIVO", proyecto.Activo);

                proyecto.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public void Eliminar(string id)
        {
            string sql = @"DELETE FROM PROYECTO WHERE ID=@ID";

            using (DataUtil d = new DataUtil(TypeDataBase.Prueba, CommandType.Text))
            {
                d.Comando.CommandText = sql;

                d.AddParameter("@ID", id);

                d.ExecuteNonQuery();
            }
        }


        public ProyectoType Cargar()
        {
            List<ProyectoType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<ProyectoType> CargarLista()
        {
            List<ProyectoType> l = new List<ProyectoType>();

            using (DataUtil data = this._consultaCargar())
                using (IDataReader reader = data.ExecuteReader())
                {
                    ProyectoType o = null;

                    while (reader.Read())
                    {
                        o = new ProyectoType();

                        o.Id = reader.GetValue(data.GetOrdinalReader("ID")).ToString();
                        o.Nombre = reader.GetValue(data.GetOrdinalReader("NOMBRE")).ToString();
                        o.Descripcion = reader.GetValue(data.GetOrdinalReader("DESCRIPCION")).ToString();
                        o.FechaRegistro = reader.GetValue(data.GetOrdinalReader("FECHAREGISTRO")).ToString();
                        o.Prioridad = reader.GetValue(data.GetOrdinalReader("PRIORIDAD")).ToString();
                        o.Severidad = reader.GetValue(data.GetOrdinalReader("SEVERIDAD")).ToString();
                        o.Activo = Convert.ToBoolean(reader.GetValue(data.GetOrdinalReader("ACTIVO")));
                        o.ActivoDescripcion = reader.GetValue(data.GetOrdinalReader("ACTIVODESCRIPCION")).ToString();

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<ProyectoType> CargarListaVista()
        {
            using (DataUtil d = this._consultaCargarVista(0,0,""))
                using (IDataReader r = d.ExecuteReader())
                    return this._cargarReaderVista(d,r);
        }

        public List<ProyectoType> CargarListaVista(int paginaActual,int cantidadMostrar,string orderBy)
        {
            List<ProyectoType> l = null;

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar, orderBy))
                using (IDataReader r = d.ExecuteReader())
                    l = this._cargarReaderVista(d, r);

            l.Capacity = _totalRegistros;

            return l;
        }

        private List<ProyectoType> _cargarReaderVista(DataUtil data,IDataReader reader)
        {
            List<ProyectoType> l = new List<ProyectoType>();

            ProyectoType o = null;

            while (reader.Read())
            {
                o = new ProyectoType();

                o.Id = reader.GetValue(data.GetOrdinalReader("ID")).ToString();
                o.Nombre = reader.GetValue(data.GetOrdinalReader("NOMBRE")).ToString();
                o.Descripcion = reader.GetValue(data.GetOrdinalReader("DESCRIPCION")).ToString();
                o.FechaRegistro = reader.GetValue(data.GetOrdinalReader("FECHAREGISTRO")).ToString();
                o.Prioridad = reader.GetValue(data.GetOrdinalReader("PRIORIDAD")).ToString();
                o.Severidad = reader.GetValue(data.GetOrdinalReader("SEVERIDAD")).ToString();
                o.Activo = Convert.ToBoolean(reader.GetValue(data.GetOrdinalReader("ACTIVO")));
                o.ActivoDescripcion = reader.GetValue(data.GetOrdinalReader("ACTIVODESCRIPCION")).ToString();

                l.Add(o);
            }

            return l;
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND PR.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }

        public void FiltrarPorNombre(string nombre)
        {
            _where += @"AND PR.NOMBRE LIKE '%' + @NOMBRE + '%'
                                 ";

            _parametrosConsulta.Add("@NOMBRE", nombre);
        }

        public void FiltrarPorDescripcion(string descripcion)
        {
            _where += @"AND PR.DESCRIPCION LIKE '%' + @DESCRIPCION + '%'
                                 ";

            _parametrosConsulta.Add("@DESCRIPCION", descripcion);
        }

        public void FiltrarPorFechaRegistro(string fechaRegistro)
        {
            _where += @"AND CAST(PR.FECHAREGISTRO AS DATE) = CONVERT(DATE,@FECHAREGISTRO,103)
                                 ";

            _parametrosConsulta.Add("@FECHAREGISTRO", fechaRegistro);
        }

        public void FiltrarPorPrioridad(string prioridad)
        {
            _where += @"AND ISNULL(PR.PRIORIDAD,0) = @PRIORIDAD
                                 ";

            _parametrosConsulta.Add("@PRIORIDAD", prioridad);
        }

        public void FiltrarPorSeveridad(string severidad)
        {
            _where += @"AND ISNULL(PR.SEVERIDAD,0) = @SEVERIDAD
                                 ";

            _parametrosConsulta.Add("@SEVERIDAD", severidad);
        }

        #endregion
    }
}
